﻿using System;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
using System.ServiceModel.DomainServices.Server;

namespace IssueVision.Data.Web
{
    /// <summary>
    /// User class exposes the following data members to the client:
    /// Name, FirstName, LastName, Email, Password, NewPassword,
    /// PasswordQuestion, PasswordAnswer, UserType, IsUserMaintenance
    /// and ProfileResetFlag
    /// </summary>
    [MetadataTypeAttribute(typeof(User.UserMetadata))]
    public partial class User
    {
        // This class allows you to attach custom attributes to properties
        // of the User class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal class UserMetadata
        {

            // Metadata classes are not meant to be instantiated.
            protected UserMetadata()
            {
            }

            [Display(Name = "UserNameLabel", ResourceType = typeof(IssueVisionResources))]
            [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
            [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))]
            public string Name { get; set; }

            [CustomValidation(typeof(UserRules), "IsValidEmail")]
            public string Email { get; set; }

            [Exclude]
            public string PasswordAnswerHash { get; set; }

            [Exclude]
            public string PasswordAnswerSalt { get; set; }

            [Exclude]
            public string PasswordHash { get; set; }

            [Exclude]
            public string PasswordSalt { get; set; }

            [Exclude]
            public Byte ProfileReset { get; set; }
        }

        [DataMember]
        [Display(Name = "PasswordLabel", ResourceType = typeof(IssueVisionResources))]
        [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
        [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "ValidationErrorBadPasswordStrength", ErrorMessageResourceType = typeof(ErrorResources))]
        [StringLength(50, MinimumLength = 12, ErrorMessageResourceName = "ValidationErrorBadPasswordLength", ErrorMessageResourceType = typeof(ErrorResources))]
        public string Password { get; set; }

        [DataMember]
        [Display(Name = "NewPasswordLabel", ResourceType = typeof(IssueVisionResources))]
        [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
        [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "ValidationErrorBadPasswordStrength", ErrorMessageResourceType = typeof(ErrorResources))]
        [StringLength(50, MinimumLength = 12, ErrorMessageResourceName = "ValidationErrorBadPasswordLength", ErrorMessageResourceType = typeof(ErrorResources))]
        public string NewPassword { get; set; }

        [DataMember]
        [Display(Name = "SecurityAnswerLabel", ResourceType = typeof(IssueVisionResources))]
        [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
        public string PasswordAnswer { get; set; }

        [DataMember]
        public bool IsUserMaintenance { get; set; }

        [DataMember]
        public bool ProfileResetFlag
        {
            get
            {
                return this.ProfileReset != (byte)0;
            }
        }
    }
}
